package model

import (
	"time"
)

// Checkin 签到记录表
type Checkin struct {
	ID            uint       `gorm:"primaryKey" json:"id"`
	MemberID      uint       `gorm:"not null;index" json:"memberId"`
	UserID        uint       `gorm:"not null" json:"userId"`
	CheckInTime   time.Time  `json:"checkInTime"`
	CheckOutTime  *time.Time `json:"checkOutTime"`
	Duration      *int       `json:"duration"`              // 锻炼时长（分钟）
	Type          int        `gorm:"default:1" json:"type"` // 类型：1进馆签到 2离馆签退
	Location      string     `json:"location"`              // 签到地点
	DeviceID      string     `json:"deviceId"`              // 设备ID/门禁编号
	IPAddress     string     `json:"ipAddress"`             // IP地址
	Latitude      *float64   `json:"latitude"`              // 纬度
	Longitude     *float64   `json:"longitude"`             // 经度
	Accuracy      *float64   `json:"accuracy"`              // 定位精度（米）
	QRCode        string     `json:"qrCode"`                // 二维码内容
	CheckInMethod string     `json:"checkInMethod"`         // 签到方式：GPS/QR/BOTH/MANUAL
	OperatorID    *uint      `json:"operatorId"`            // 操作人ID（前台代签时记录）
	Note          string     `json:"note"`                  // 备注
	CreatedAt     time.Time  `json:"createdAt"`
	UpdatedAt     time.Time  `json:"updatedAt"`

	// 关联字段
	Member *Member `gorm:"foreignKey:MemberID" json:"member,omitempty"`
	User   *User   `gorm:"foreignKey:UserID" json:"user,omitempty"`
}

// Gym 健身房信息表（用于地理围栏验证）
type Gym struct {
	ID        uint      `gorm:"primaryKey" json:"id"`
	Name      string    `json:"name"`
	Address   string    `json:"address"`
	CenterLat float64   `json:"centerLat"` // 中心点纬度
	CenterLng float64   `json:"centerLng"` // 中心点经度
	Radius    float64   `json:"radius"`    // 半径（米）
	CreatedAt time.Time `json:"createdAt"`
	UpdatedAt time.Time `json:"updatedAt"`
}

// ==================== 请求/响应模型 ====================

// CheckinReq 会员签到请求
type CheckinReq struct {
	MemberID      *uint    `json:"memberId"`      // 会员ID，前台代签时必填，会员自签时可选
	DeviceID      string   `json:"deviceId"`      // 设备ID，可选
	Location      string   `json:"location"`      // 签到地点，可选
	Latitude      *float64 `json:"latitude"`      // 纬度，可选
	Longitude     *float64 `json:"longitude"`     // 经度，可选
	Accuracy      *float64 `json:"accuracy"`      // 定位精度，可选
	QRCode        string   `json:"qrCode"`        // 二维码内容，可选
	CheckInMethod string   `json:"checkInMethod"` // 签到方式：GPS/QR/BOTH/MANUAL
	Type          int      `json:"type"`          // 签到类型：1进馆签到 2离馆签退，默认1
	Note          string   `json:"note"`          // 备注，可选
}

// CheckoutReq 会员签退请求
type CheckoutReq struct {
	MemberID *uint  `json:"memberId"` // 会员ID，前台代签时必填，会员自签时可选
	DeviceID string `json:"deviceId"` // 设备ID，可选
	Note     string `json:"note"`     // 备注，可选
}

// CheckinResp 签到响应
type CheckinResp struct {
	ID              uint      `json:"id"`
	MemberID        uint      `json:"memberId"`
	MemberName      string    `json:"memberName"`
	CheckInTime     time.Time `json:"checkInTime"`
	Location        string    `json:"location"`
	Type            int       `json:"type"`
	TypeText        string    `json:"typeText"`
	ConsecutiveDays int       `json:"consecutiveDays"`
}

// CheckoutResp 签退响应
type CheckoutResp struct {
	ID            uint      `json:"id"`
	MemberID      uint      `json:"memberId"`
	MemberName    string    `json:"memberName"`
	CheckInTime   time.Time `json:"checkInTime"`
	CheckOutTime  time.Time `json:"checkOutTime"`
	Duration      int       `json:"duration"`
	TotalDuration int       `json:"totalDuration"`
}

// CheckinListReq 签到记录列表查询请求
type CheckinListReq struct {
	Page      int    `form:"page"`
	PageSize  int    `form:"pageSize"`
	StartDate string `form:"startDate"` // 开始日期（YYYY-MM-DD）
	EndDate   string `form:"endDate"`   // 结束日期（YYYY-MM-DD）
	Type      *int   `form:"type"`      // 类型筛选（1:进馆签到 2:离馆签退）
	Keyword   string `form:"keyword"`   // 搜索关键词（会员姓名/卡号）
}

// CheckinRecord 签到记录详情
type CheckinRecord struct {
	ID           uint       `json:"id"`
	CheckInTime  time.Time  `json:"checkInTime"`
	CheckOutTime *time.Time `json:"checkOutTime"`
	Duration     *int       `json:"duration"`
	Location     string     `json:"location"`
	DeviceID     string     `json:"deviceId"`
	Type         int        `json:"type"`
	TypeText     string     `json:"typeText"`
}

// CheckinListResp 签到记录列表响应
type CheckinListResp struct {
	List     []CheckinRecord `json:"list"`
	Total    int64           `json:"total"`
	Page     int             `json:"page"`
	PageSize int             `json:"pageSize"`
}

// CheckinStatisticsReq 签到统计请求
type CheckinStatisticsReq struct {
	Period string `form:"period"` // 统计周期（day/week/month，默认month）
}

// CheckinStatisticsResp 签到统计响应
type CheckinStatisticsResp struct {
	TotalDays       int `json:"totalDays"`
	TotalDuration   int `json:"totalDuration"`
	ConsecutiveDays int `json:"consecutiveDays"`
	AvgDuration     int `json:"avgDuration"`
	WeeklyTrend     []struct {
		Date     string `json:"date"`
		Count    int    `json:"count"`
		Duration int    `json:"duration"`
	} `json:"weeklyTrend"`
	Rank struct {
		Percentage   int `json:"percentage"`
		TotalMembers int `json:"totalMembers"`
	} `json:"rank"`
}

// StaffCheckinListReq 前台查看签到列表请求
type StaffCheckinListReq struct {
	Page     int    `form:"page"`
	PageSize int    `form:"pageSize"`
	Date     string `form:"date"`    // 日期（YYYY-MM-DD，默认今天）
	Status   *int   `form:"status"`  // 状态（1:已签到未签退 2:已签退）
	Keyword  string `form:"keyword"` // 搜索关键词（会员姓名/卡号）
}

// StaffCheckinRecord 前台签到记录
type StaffCheckinRecord struct {
	ID           uint       `json:"id"`
	MemberID     uint       `json:"memberId"`
	MemberName   string     `json:"memberName"`
	MemberCard   string     `json:"memberCard"`
	CheckInTime  time.Time  `json:"checkInTime"`
	CheckOutTime *time.Time `json:"checkOutTime"`
	Duration     int        `json:"duration"`
	Status       int        `json:"status"`
	StatusText   string     `json:"statusText"`
}

// StaffCheckinListResp 前台签到列表响应
type StaffCheckinListResp struct {
	InGymCount int                  `json:"inGymCount"`
	TodayTotal int                  `json:"todayTotal"`
	Records    []StaffCheckinRecord `json:"records"`
	Total      int64                `json:"total"`
	Page       int                  `json:"page"`
	PageSize   int                  `json:"pageSize"`
}

// StaffCheckinReq 前台代会员签到请求
type StaffCheckinReq struct {
	MemberID uint   `json:"memberId" binding:"required"`
	DeviceID string `json:"deviceId"`
	Note     string `json:"note"`
}

// StaffCheckinResp 前台代会员签到响应
type StaffCheckinResp struct {
	ID              uint      `json:"id"`
	MemberID        uint      `json:"memberId"`
	MemberName      string    `json:"memberName"`
	MemberCard      string    `json:"memberCard"`
	CheckInTime     time.Time `json:"checkInTime"`
	Operator        string    `json:"operator"`
	ConsecutiveDays int       `json:"consecutiveDays"`
}

// AdminCheckinListReq 管理员查看签到列表请求
type AdminCheckinListReq struct {
	Page      int    `form:"page"`
	PageSize  int    `form:"pageSize"`
	MemberID  *uint  `form:"memberId"`  // 会员ID筛选
	StartDate string `form:"startDate"` // 开始日期（YYYY-MM-DD）
	EndDate   string `form:"endDate"`   // 结束日期（YYYY-MM-DD）
	Location  string `form:"location"`  // 签到地点筛选
	Type      *int   `form:"type"`      // 类型筛选（1:进馆 2:签退）
	Keyword   string `form:"keyword"`   // 搜索关键词（会员姓名/卡号）
	Export    bool   `form:"export"`    // 是否导出（true导出Excel）
}

// AdminCheckinRecord 管理员签到记录
type AdminCheckinRecord struct {
	ID           uint       `json:"id"`
	MemberID     uint       `json:"memberId"`
	MemberName   string     `json:"memberName"`
	MemberCard   string     `json:"memberCard"`
	CheckInTime  time.Time  `json:"checkInTime"`
	CheckOutTime *time.Time `json:"checkOutTime"`
	Duration     *int       `json:"duration"`
	Location     string     `json:"location"`
	DeviceID     string     `json:"deviceId"`
	Type         int        `json:"type"`
	TypeText     string     `json:"typeText"`
	Operator     *string    `json:"operator"`
}

// AdminCheckinListResp 管理员签到列表响应
type AdminCheckinListResp struct {
	List     []AdminCheckinRecord `json:"list"`
	Total    int64                `json:"total"`
	Page     int                  `json:"page"`
	PageSize int                  `json:"pageSize"`
}

// AdminAnalyticsReq 管理员统计分析请求
type AdminAnalyticsReq struct {
	Period    string `form:"period"`    // 统计周期（day/week/month/year，默认month）
	StartDate string `form:"startDate"` // 开始日期（YYYY-MM-DD）
	EndDate   string `form:"endDate"`   // 结束日期（YYYY-MM-DD）
}

// AdminAnalyticsResp 管理员统计分析响应
type AdminAnalyticsResp struct {
	Overview struct {
		TotalCheckins int `json:"totalCheckins"`
		UniqueMembers int `json:"uniqueMembers"`
		AvgDuration   int `json:"avgDuration"`
		AvgDaily      int `json:"avgDaily"`
	} `json:"overview"`
	Trend []struct {
		Date     string `json:"date"`
		Count    int    `json:"count"`
		Duration int    `json:"duration"`
	} `json:"trend"`
	PeakHours []struct {
		Hour  int `json:"hour"`
		Count int `json:"count"`
	} `json:"peakHours"`
	TopMembers []struct {
		MemberID      uint   `json:"memberId"`
		MemberName    string `json:"memberName"`
		CheckinCount  int    `json:"checkinCount"`
		TotalDuration int    `json:"totalDuration"`
	} `json:"topMembers"`
	ChurnWarning []struct {
		MemberID    uint      `json:"memberId"`
		MemberName  string    `json:"memberName"`
		LastCheckin time.Time `json:"lastCheckin"`
		DaysAgo     int       `json:"daysAgo"`
	} `json:"churnWarning"`
}

// BatchCheckinReq 批量操作签到请求
type BatchCheckinReq struct {
	Action  string `json:"action" binding:"required,oneof=create delete"` // 操作类型：create/delete
	Records []struct {
		MemberID     uint       `json:"memberId" binding:"required"`
		CheckInTime  time.Time  `json:"checkInTime" binding:"required"`
		CheckOutTime *time.Time `json:"checkOutTime"`
		Location     string     `json:"location"`
	} `json:"records" binding:"required,min=1"`
	Reason string `json:"reason" binding:"required"` // 操作原因
}

// BatchCheckinResp 批量操作签到响应
type BatchCheckinResp struct {
	SuccessCount int `json:"successCount"`
	FailCount    int `json:"failCount"`
	Details      []struct {
		MemberID   uint   `json:"memberId"`
		MemberName string `json:"memberName"`
		Status     string `json:"status"`  // success/failure
		Message    string `json:"message"` // 失败原因
	} `json:"details"`
}

// GenerateQRCodeReq 生成二维码请求
type GenerateQRCodeReq struct {
	GymID         uint `json:"gymId" binding:"required"`
	ExpireMinutes int  `json:"expireMinutes"` // 有效期（分钟，默认30）
}

// GenerateQRCodeResp 生成二维码响应
type GenerateQRCodeResp struct {
	QRCodeContent string    `json:"qrCodeContent"`
	ExpireAt      time.Time `json:"expireAt"`
}
